package tech.aistar.day10;

import javax.swing.text.html.parser.Entity;
import java.util.*;
import java.util.function.BiConsumer;

/**
 * 本类用来演示: HashMap
 *
 * @author: success
 * @date: 2021/3/22 9:11 上午
 */
public class HashMapDemo {
    public static void main(String[] args) {
        //key - String/包装类型[推荐] - 对象类型
        //value - 可以是一切对象类型
        Map<Integer,String> maps = new HashMap<>();
        maps.put(1,"ok");
        maps.put(2,"google");

        maps.put(1,"mac");

        //获取集合中的元素的格式
        System.out.println(maps.size());//2

        //根据key获取value
        System.out.println(maps.get(2));//google

        //判断maps中是否包含某个key
        System.out.println(maps.containsKey(2));//true

        System.out.println(maps.isEmpty());//如果个数为0.返回true

        //maps.clear();//清空集合

        //获取maps中的所有的value
        Collection<String> values = maps.values();
        System.out.println(values);//[mac, google]

        //根据key来进行删除
       // maps.remove(2);

       // maps.forEach((k,v)-> System.out.println(k.hashCode()^(k.hashCode()>>>16)));

        //HashSet的底层就是HashMap
        //key重复的时候 - key是不变的,value会覆盖.

        //System.out.println(maps);

        //map集合的迭代方式
        //1. 第一种 keySet

        //将maps集合中的所有的key放入到了Set集合中.
        Set<Integer> keySets = maps.keySet();
        //遍历set集合 - 可以使用增强for,可以使用集合特有的迭代方式 - 迭代器
        Iterator<Integer> iter = keySets.iterator();
        while(iter.hasNext()){
            Integer key = iter.next();
            String value = maps.get(key);
            System.out.println(key+"->"+value);
        }

        System.out.println("=====");

        //第二种迭代器方式
        //调用完entrySet方法之后,会将maps集合中的每个key和value封装到了一个内置对象Entry当中
        Set<Map.Entry<Integer,String>> sets = maps.entrySet();
        //获取迭代器对象
        Iterator<Map.Entry<Integer,String>> iters = sets.iterator();
        while(iters.hasNext()){
            Map.Entry<Integer,String> entry = iters.next();
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+":"+value);
        }

        System.out.println("=====");

//        MyHashMap<Integer,String> my = new MyHashMap<Integer,String>();
//        Set<MyHashMap<Integer, String>.MyEntry<Integer, String>> mySets = my.myIterator(maps);
//
//        for (MyHashMap<Integer, String>.MyEntry<Integer, String> mySet : mySets) {
//            System.out.println(mySet.getKey()+"==");
//            System.out.println(mySet.getValue()+"==");
//        }

//        maps.forEach(new BiConsumer<Integer, String>() {
//            @Override
//            public void accept(Integer integer, String s) {
//
//            }
//        });

        maps.forEach((key,value)->{
            System.out.println("key:"+key);
            System.out.println("value:"+value);
        });
    }
}

class MyHashMap<K,V>{

    public Set<MyEntry<K,V>> myIterator(Map<K,V> map){
        Set<K> sets = map.keySet();

        Set<MyEntry<K,V>> setEntry = new HashSet<MyEntry<K,V>>();

        for (K key : sets) {
            V value = map.get(key);
            //对象 -> 封装数据的
            MyEntry<K,V> entry = new MyEntry<K,V>();
            entry.setKey(key);
            entry.setValue(value);

            setEntry.add(entry);
        }
        return setEntry;
    }

    class MyEntry<K,V> {
        private K key;
        private V value;

        public MyEntry() {
        }

        public MyEntry(K key, V value) {
            this.key = key;
            this.value = value;
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("MyEntry{");
            sb.append("key=").append(key);
            sb.append(", value=").append(value);
            sb.append('}');
            return sb.toString();
        }
    }
}
